home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / umich / network / ka9q / ka9q_src.arc / ARPCMD.C < prev    next >
C/C++ Source or Header  |  1988-07-28  |  4KB  |  197 lines

  1. #include <stdio.h>
  2. #include "global.h"
  3. #include "mbuf.h"
  4. #include "timer.h"
  5. #ifndef ATARI_ST        /* DG2KK */
  6. #include "enet.h"
  7. #endif
  8. #include "ax25.h"
  9. #include "arp.h"
  10. #include "cmdparse.h"
  11.  
  12. extern char badhost[];
  13. extern char nospace[];
  14.  
  15. int doarpadd(),doarpdrop();
  16. struct cmds arpcmds[] = {
  17.     "add", doarpadd, 4,
  18.     "usage: arp add <hostid> ether|ax25|netrom <callsign|ether addr>",
  19.     "arp add failed",
  20.  
  21.     "drop", doarpdrop, 3,
  22.     "usage: arp drop <hostid> ether|ax25|netrom",
  23.     "not in table",
  24.  
  25.     NULLCHAR, NULLFP, 0,
  26.     "arp subcommands: add, drop",
  27.     NULLCHAR, 
  28. };
  29. char *arptypes[] = {
  30.     "",
  31.     "10 Mb Ethernet",
  32.     "3 Mb Ethernet",
  33.     "AX.25",
  34.     "Pronet",
  35.     "Chaos",
  36.     "Netrom",
  37.     "Arcnet",
  38.     "Appletalk"
  39. };
  40.  
  41. int
  42. doarp(argc,argv)
  43. int argc;
  44. char *argv[];
  45. {
  46.     if(argc < 2){
  47.         dumparp();
  48.         return 0;
  49.     }
  50.     return subcmd(arpcmds,argc,argv);
  51. }
  52. static
  53. doarpadd(argc,argv)
  54. int argc;
  55. char *argv[];
  56. {
  57.     int16 hwalen,hardware,naddr;
  58.     int32 addr,resolve();
  59.     char *hwaddr;
  60.     struct arp_tab *ap;
  61.     struct arp_type *at;
  62.     void arp_drop();
  63.  
  64.     if((addr = resolve(argv[1])) == 0){
  65.         printf(badhost,argv[1]);
  66.         return 1;
  67.     }
  68.     /* This is a kludge. It really ought to be table driven */
  69.     switch(tolower(argv[2][0])){
  70.     case 'e':    /* "ether" */
  71.         hardware = ARP_ETHER;
  72.         naddr = 1;
  73.         break;        
  74.     case 'a':    /* "ax25" */
  75.         hardware = ARP_AX25;
  76.         naddr = argc - 3;
  77.         break;
  78.     case 'm':    /* "mac appletalk" */
  79.         hardware = ARP_APPLETALK;
  80.         naddr = 1;
  81.         break;
  82.     case 'n':    /* netrom */
  83.         hardware = ARP_NETROM;
  84.         naddr = argc - 3;
  85.         if (naddr > 1) {
  86.             printf("Specify only destination callsign\n");
  87.             return -1;
  88.         }
  89.         break;
  90.     default:
  91.         printf("unknown hardware type \"%s\"\n",argv[2]);
  92.         return -1;
  93.     }
  94.     /* If an entry already exists, clear it */
  95.     if((ap = arp_lookup(hardware,addr)) != NULLARP)
  96.         arp_drop(ap);
  97.  
  98.     at = &arp_type[hardware];
  99.     if(at->scan == NULLFP){
  100.         printf("Attach device first\n");
  101.         return 1;
  102.     }
  103.     /* Allocate buffer for hardware address and fill with remaining args */
  104.     hwalen = at->hwalen * naddr;
  105.     if((hwaddr = malloc(hwalen)) == NULLCHAR){
  106.         printf(nospace);
  107.         return 0;
  108.     }
  109.     /* Destination address */
  110.     (*at->scan)(hwaddr,&argv[3],argc - 3);
  111.     ap = arp_add(addr,hardware,hwaddr,hwalen);    /* Put in table */
  112.     free(hwaddr);                    /* Clean up */
  113.     stop_timer(&ap->timer);            /* Make entry permanent */
  114.     ap->timer.count = ap->timer.start = 0;
  115.     return 0;
  116. }
  117. /* Remove an ARP entry */
  118. static
  119. doarpdrop(argc,argv)
  120. int argc;
  121. char *argv[];
  122. {
  123.     int16 hardware;
  124.     int32 addr,resolve();
  125.     struct arp_tab *ap;
  126.     void arp_drop();
  127.  
  128.     if((addr = resolve(argv[1])) == 0){
  129.         printf(badhost,argv[1]);
  130.         return 1;
  131.     }
  132.     /* This is a kludge. It really ought to be table driven */
  133.     switch(tolower(argv[2][0])){
  134.     case 'e':    /* "ether" */
  135.         hardware = ARP_ETHER;
  136.         break;        
  137.     case 'a':    /* "ax25" */
  138.         hardware = ARP_AX25;
  139.         break;
  140.     case 'm':    /* "mac appletalk" */
  141.         hardware = ARP_APPLETALK;
  142.         break;
  143.     case 'n':    /* netrom */
  144.         hardware = ARP_NETROM;
  145.         break;
  146.     default:
  147.         hardware = 0;
  148.         break;
  149.     }
  150.     if((ap = arp_lookup(hardware,addr)) == NULLARP)
  151.         return -1;
  152.     arp_drop(ap);
  153.     return 0;    
  154. }
  155. /* Dump ARP table */
  156. static
  157. dumparp()
  158. {
  159.     register int i;
  160.     extern struct arp_stat arp_stat;
  161.     register struct arp_tab *ap;
  162.     char e[128];
  163.     char *inet_ntoa();
  164.     extern char *arptypes[];
  165.  
  166.     printf("received %u badtype %u bogus addr %u reqst in %u replies %u reqst out %u\n",
  167.      arp_stat.recv,arp_stat.badtype,arp_stat.badaddr,arp_stat.inreq,
  168.      arp_stat.replies,arp_stat.outreq);
  169.  
  170.     printf("IP addr         Type           Time Q Addr\n");
  171.     for(i=0;i<ARPSIZE;i++){
  172.         for(ap = arp_tab[i];ap != (struct arp_tab *)NULL;ap = ap->next){
  173.             printf("%-16s",inet_ntoa(ap->ip_addr));
  174.             printf("%-15s",arptypes[ap->hardware]);
  175.             printf("%-5ld",ap->timer.count*(long)MSPTICK/1000);
  176.             if(ap->state == ARP_PENDING)
  177.                 printf("%-2u",len_q(ap->pending));
  178.             else
  179.                 printf("  ");
  180.             if(ap->state == ARP_VALID){
  181.                 if(arp_type[ap->hardware].format != NULLFP){
  182.                     (*arp_type[ap->hardware].format)(e,ap->hw_addr);
  183.                 } else {
  184.                     e[0] = '\0';
  185.                 }
  186.                 printf("%s",e);
  187.             } else {
  188.                 printf("[unknown]");
  189.             }
  190.             printf("\n");
  191.         }
  192.     }
  193.     return 0;
  194. }
  195.  
  196.  
  197.